﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ImobitechModel.com.Constantes;
using ImobitechModel.Facade;
using ImobitechDao;

namespace ImobitechModel.com.Controller
{
    public class ControladorAnuncio
    {
        public Object retornaImoveis(bool aprovado, int tipo)
        {
            AnuncioFacade anuncioFacade = AnuncioFacade.getInstance();

            List<Anunciar> anunciarList = new List<Anunciar>();
            List<Anuncio> anuncios = (List<Anuncio>)anuncioFacade.retornaAnuncios(aprovado, tipo);

            for (int i = 0; i < anuncios.Count; i++)
            {
                Anunciar anunciar = new Anunciar();
                anunciar.id = anuncios[i].Id;
                anunciar.caminho = anuncios[i].Imovel.Fotos.First().caminho;
                anunciar.descricao = anuncios[i].DescricaoCurta;
                anunciar.valor = anuncios[i].Valor;
                anunciar.idImovel = anuncios[i].Imovel.Id;
                anunciar.url = "~/Anuncio/Detalhes.aspx?id=" + anunciar.id;
                anunciarList.Add(anunciar);
            }

            return anunciarList;
        }

        public Object retornaImoveis(bool aprovado)
        {
            AnuncioFacade anuncioFacade = AnuncioFacade.getInstance();

            List<Anunciar> anunciarList = new List<Anunciar>();
            List<Anuncio> anuncios = (List<Anuncio>)anuncioFacade.retornaAnuncios(aprovado);

            for (int i = 0; i < anuncios.Count; i++)
            {
                Anunciar anunciar = new Anunciar();
                anunciar.id = anuncios[i].Id;
                anunciar.caminho = anuncios[i].Imovel.Fotos.First().caminho;
                anunciar.descricao = anuncios[i].Descricao;
                anunciar.valor = anuncios[i].Valor;
                anunciarList.Add(anunciar);
            }

            return anunciarList;
        }

        public object buscaAnuncio(IDictionary<string, string> values, bool aprovado)
        {
            AnuncioFacade anuncioFacade = AnuncioFacade.getInstance();

            string cidade = values.First(p => p.Key == NomeCampoConstantes.campo_ImovelCidade).Value != "" ?
                values.First(p => p.Key == NomeCampoConstantes.campo_ImovelCidade).Value : "";
            string[] bairro = values.First(p => p.Key == NomeCampoConstantes.campo_ImovelBairro).Value != "" ?
                values.First(p => p.Key == NomeCampoConstantes.campo_ImovelBairro).Value.Split(',') : new string[0] { };
            string estado = values.First(p => p.Key == NomeCampoConstantes.campo_ImovelEstado).Value != "" ?
                values.First(p => p.Key == NomeCampoConstantes.campo_ImovelEstado).Value : "";

            int tipo = values.First(p => p.Key == NomeCampoConstantes.campo_ImovelTipoAnuncio).Value != null ?
                int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_ImovelTipoAnuncio).Value) : 0;

            int tipoImovel = values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioTipoImovel).Value != null ?
                int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioTipoImovel).Value) : 0;

            int valor = values.Where(p => p.Key == NomeCampoConstantes.campo_AnuncioBuscaValor).Count() > 0 ?
                int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioBuscaValor).Value) : 0;

            int metragem = values.Where(p => p.Key == NomeCampoConstantes.campo_AnuncioMetragem).Count() > 0 ?
                int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioMetragem).Value) : 0;

            int quartos = values.Where(p => p.Key == NomeCampoConstantes.campo_AnuncioQuartos).Count() > 0 ?
                int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioQuartos).Value) : 0;

            int garagem = values.Where(p => p.Key == NomeCampoConstantes.campo_AnuncioGaragem).Count() > 0 ?
                int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioGaragem).Value) : 0;

            List<Anunciar> anunciarList = new List<Anunciar>();
            List<Anuncio> anuncios = (List<Anuncio>)anuncioFacade.retornaAnuncios(aprovado, tipo, cidade, estado, bairro, tipoImovel, valor, metragem, quartos, garagem);

            for (int i = 0; i < anuncios.Count; i++)
            {
                Anunciar anunciar = new Anunciar();
                anunciar.id = anuncios[i].Id;
                anunciar.caminho = anuncios[i].Imovel.Fotos.First().caminho;
                anunciar.descricao = anuncios[i].DescricaoCurta;
                anunciar.valor = anuncios[i].Valor;
                anunciar.idImovel = anuncios[i].Imovel.Id;
                anunciar.url = "~/Anuncio/Detalhes.aspx?id=" + anunciar.id;
                anunciarList.Add(anunciar);
            }

            return anunciarList;

        }

        public Anuncio buscarAnuncio(int id)
        {
            AnuncioFacade anuncioFacade = AnuncioFacade.getInstance();
            return (Anuncio)anuncioFacade.retornaAnuncio(id);
        }

        public object buscaAnuncio(int id)
        {
            Anuncio anuncio = buscarAnuncio(id);

            IDictionary<string, string> retorno = new Dictionary<string, string>();

            retorno.Add(NomeCampoConstantes.campo_ImovelEndereco, anuncio.Imovel.Endereço);
            retorno.Add(NomeCampoConstantes.campo_ImovelComplemento, anuncio.Imovel.Complemento);
            retorno.Add(NomeCampoConstantes.campo_ImovelCidade, anuncio.Imovel.Cidade + "/" + anuncio.Imovel.Estado);
            retorno.Add(NomeCampoConstantes.campo_ImovelBairro, anuncio.Imovel.Bairro);
            retorno.Add(NomeCampoConstantes.campo_ImovelAreaTotal, anuncio.Imovel.AreaTotal.ToString());
            retorno.Add(NomeCampoConstantes.campo_ImovelAreaPrivada, anuncio.Imovel.AreaPrivada.ToString());
            retorno.Add(NomeCampoConstantes.campo_ImovelReferencia, anuncio.Imovel.Referencia);
            retorno.Add(NomeCampoConstantes.campo_ImovelQuartos, anuncio.Imovel.Quartos.ToString());
            retorno.Add(NomeCampoConstantes.campo_ImovelQuartosSuite, anuncio.Imovel.QuartosSuite.ToString());
            retorno.Add(NomeCampoConstantes.campo_ImovelNumeroGaragem, anuncio.Imovel.NumeroGaragem.ToString());
            retorno.Add(NomeCampoConstantes.campo_AnuncioValor, anuncio.Valor.ToString());
            //TODO: Bonificação
            retorno.Add(NomeCampoConstantes.campo_TipoImovelDescricao, anuncio.Imovel.Tipo_Imovel.descricao);

            //TODO: Situação
            retorno.Add(NomeCampoConstantes.campo_AnuncioDescricao, anuncio.Descricao);

            return retorno;
        }

        public object marcarHorario(IDictionary<string, string> values)
        {
            try
            {
                Anuncio anuncio = buscarAnuncio(int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioId).Value));
                Visita visita = new Visita();
                visita.DataVisita = DateTime.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioDataVisita).Value);
                visita.Dt_Cadastro = DateTime.Now;
                visita.Imovel = anuncio.Imovel;

                ControladorPerfis cgPerfil = new ControladorPerfis();
                Pessoa cliente = (Pessoa)cgPerfil.retornaPessoa(int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_pessoaId).Value));
                visita.Pessoa_Papel = cliente.Pessoa_Papel.First(p => p.Papel.Nome == "Cliente");

                visita.Pessoa_Papel1 = (Pessoa_Papel)buscaFuncionarioAgenda(visita.DataVisita);

                AnuncioFacade anuncioFacade = AnuncioFacade.getInstance();

                return anuncioFacade.marcaVisita(visita);
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        public object buscaFuncionarioAgenda(DateTime data)
        {
            AnuncioFacade anuncioFacade = AnuncioFacade.getInstance();
            return anuncioFacade.retornaFuncionarioVisita(data.AddMinutes(-20), data.AddMinutes(20));
        }

        public object buscaFotoAnuncio(int id)
        {
            AnuncioFacade anuncioFacade = AnuncioFacade.getInstance();
            Anuncio anuncio = (Anuncio)anuncioFacade.retornaAnuncio(id);

            List<Tuple<int, string, string>> values = new List<Tuple<int, string, string>>();

            List<Fotos> fotos = anuncio.Imovel.Fotos.ToList();

            for (int index = 0; index < fotos.Count; index++)
            {
                values.Add(new Tuple<int, string, string>(fotos[index].Id, anuncio.Imovel.Id.ToString(), fotos[index].caminho));
            }

            //foreach(Tuple<int, string, string> teste in values)
            //{
            //    teste.Item1
            //}

            return values;
        }

        public object candidatar(IDictionary<string, string> values)
        {
            Candidato candidato = new Candidato();
            Anuncio anuncio = buscarAnuncio(int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_AnuncioId).Value));
            candidato.Anuncio = anuncio;

            ControladorPerfis cgPerfil = new ControladorPerfis();
            Pessoa cliente = (Pessoa)cgPerfil.retornaPessoa(int.Parse(values.First(p => p.Key == NomeCampoConstantes.campo_pessoaId).Value));
            candidato.Pessoa_Papel = cliente.Pessoa_Papel.First(p => p.Papel.Nome == "Cliente");

            candidato.Dt_Candaditar = DateTime.Now;
            AnuncioFacade _anuncioFacade = AnuncioFacade.getInstance();
            return _anuncioFacade.candidatar(candidato);
        }
    }
}
